/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * SearchRes.java
 *
 * Created on Feb 23, 2012, 10:57:36 PM
 */
package handax.GUI;

import java.awt.event.ItemEvent;
import handax.controller.DBManager;
import handax.entities.*;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.AbstractListModel;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Andreas Apostolidis
 */
public class SearchRes extends javax.swing.JFrame {

    private DBManager dbm;
    private RegisteredUser root;
    private String username;
    private int restId = 0;
    private String restName;
    private Reservation reservation;
    private ReservSystem service;

//    /** Creates new form SearchRes */
    public SearchRes(DBManager dbm, ReservSystem service, Reservation reservation) {

        this.dbm = dbm;
        this.service = service;
        this.reservation = reservation;
        initComponents();


        restNameTextField.setText(null);
        /*οριζουμε το μοντελο για την λίστα κατηγοριων δημιουργόντας ενα αντικείμενο τύπου categoryListModel 
        που κάνει retrieve όλες τις κατηγορίες απο την βάση*/
        categoryList.setModel(new CategoryListModel());
        //δημιουργία listener για οταν επιλέγουμε μια κατηγορια από την λίστα
        categoryList.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent lse) {

                Category cat = (Category) categoryList.getSelectedValue();
            }
        });
        /*οριζουμε το μοντελο για το combobox περιοχών δημιουργόντας ενα αντικείμενο τύπου AreaComboBoxModel 
        που κάνει retrieve όλες τις περιοχές απο την βάση*/
        areaComboBox.setModel(new AreaComboBoxModel());
        //δημιουργία listener για οταν επιλέγουμε μια περιοχή από την λίστα
        areaComboBox.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent ie) {
                Area ar = (Area) areaComboBox.getSelectedItem();
            }
        });
        /*οριζουμε το μοντελο για το combobox εύρος τιμών δημιουργόντας ενα αντικείμενο τύπου PriceComboBoxModel 
        που κάνει retrieve όλες τις περιοχές απο την βάση*/
        priceComboBox.setModel(new PriceComboBoxModel());
        //δημιουργία listener για οταν επιλέγουμε ένα εύρος τιμών από την λίστα
        priceComboBox.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent ie) {
                Price pr = (Price) priceComboBox.getSelectedItem();

            }
        });

    }

    public void setUsername(final String username) {
        this.username = username;
    }

    //μέθοδος ορισμού αρχικού παραθύρου
    public void setRoot(RegisteredUser root) {
        this.root = root;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        viewButton = new javax.swing.JButton();
        ratingButton = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        exitButton = new javax.swing.JButton();
        searchRestButton = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        restNameTextField = new javax.swing.JTextField();
        areaComboBox = new javax.swing.JComboBox();
        priceComboBox = new javax.swing.JComboBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        categoryList = new javax.swing.JList();
        reservationButton = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        resultTable = new javax.swing.JTable();
        searchButton = new javax.swing.JButton();
        cleanButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(handax.HandaxApp.class).getContext().getResourceMap(SearchRes.class);
        setTitle(resourceMap.getString("Form.title")); // NOI18N
        setName("Form"); // NOI18N

        viewButton.setText(resourceMap.getString("viewButton.text")); // NOI18N
        viewButton.setName("viewButton"); // NOI18N
        viewButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                viewButtonActionPerformed(evt);
            }
        });

        ratingButton.setText(resourceMap.getString("ratingButton.text")); // NOI18N
        ratingButton.setName("ratingButton"); // NOI18N
        ratingButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ratingButtonActionPerformed(evt);
            }
        });

        jPanel1.setBackground(resourceMap.getColor("jPanel1.background")); // NOI18N
        jPanel1.setName("jPanel1"); // NOI18N

        jButton4.setText(resourceMap.getString("jButton4.text")); // NOI18N
        jButton4.setEnabled(false);
        jButton4.setName("jButton4"); // NOI18N

        jButton5.setText(resourceMap.getString("jButton5.text")); // NOI18N
        jButton5.setEnabled(false);
        jButton5.setName("jButton5"); // NOI18N

        exitButton.setText(resourceMap.getString("exitButton.text")); // NOI18N
        exitButton.setName("exitButton"); // NOI18N
        exitButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitButtonActionPerformed(evt);
            }
        });

        searchRestButton.setText(resourceMap.getString("searchRestButton.text")); // NOI18N
        searchRestButton.setEnabled(false);
        searchRestButton.setName("searchRestButton"); // NOI18N

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jButton5, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jButton4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, exitButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
            .add(searchRestButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(31, 31, 31)
                .add(searchRestButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 29, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(jButton4)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jButton5)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(exitButton)
                .addContainerGap(394, Short.MAX_VALUE))
        );

        jLabel1.setIcon(resourceMap.getIcon("jLabel1.icon")); // NOI18N
        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
        jLabel3.setName("jLabel3"); // NOI18N

        jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
        jLabel4.setName("jLabel4"); // NOI18N

        jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
        jLabel5.setName("jLabel5"); // NOI18N

        jLabel6.setFont(resourceMap.getFont("jLabel6.font")); // NOI18N
        jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
        jLabel6.setName("jLabel6"); // NOI18N

        restNameTextField.setText(resourceMap.getString("restNameTextField.text")); // NOI18N
        restNameTextField.setName("restNameTextField"); // NOI18N

        areaComboBox.setBackground(resourceMap.getColor("areaComboBox.background")); // NOI18N
        areaComboBox.setForeground(resourceMap.getColor("areaComboBox.foreground")); // NOI18N
        areaComboBox.setName("areaComboBox"); // NOI18N

        priceComboBox.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        priceComboBox.setName("priceComboBox"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        categoryList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        categoryList.setToolTipText(resourceMap.getString("categoryList.toolTipText")); // NOI18N
        categoryList.setName("categoryList"); // NOI18N
        jScrollPane1.setViewportView(categoryList);

        reservationButton.setText(resourceMap.getString("reservationButton.text")); // NOI18N
        reservationButton.setName("reservationButton"); // NOI18N
        reservationButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                reservationButtonActionPerformed(evt);
            }
        });

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        resultTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        resultTable.setColumnSelectionAllowed(true);
        resultTable.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        resultTable.setName("resultTable"); // NOI18N
        jScrollPane2.setViewportView(resultTable);
        resultTable.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

        searchButton.setText(resourceMap.getString("searchButton.text")); // NOI18N
        searchButton.setName("searchButton"); // NOI18N
        searchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchButtonActionPerformed(evt);
            }
        });

        cleanButton.setText(resourceMap.getString("cleanButton.text")); // NOI18N
        cleanButton.setName("cleanButton"); // NOI18N
        cleanButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cleanButtonActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jLabel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 852, Short.MAX_VALUE)
                    .add(layout.createSequentialGroup()
                        .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(layout.createSequentialGroup()
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                                    .add(layout.createSequentialGroup()
                                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                            .add(jLabel3)
                                            .add(jLabel2)
                                            .add(jLabel4)
                                            .add(jLabel5))
                                        .add(18, 18, 18)
                                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                            .add(priceComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 267, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                                                .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane1)
                                                .add(org.jdesktop.layout.GroupLayout.LEADING, restNameTextField)
                                                .add(org.jdesktop.layout.GroupLayout.LEADING, areaComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 258, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
                                    .add(layout.createSequentialGroup()
                                        .add(139, 139, 139)
                                        .add(searchButton)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                        .add(cleanButton))
                                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 624, Short.MAX_VALUE)
                                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                            .add(layout.createSequentialGroup()
                                .add(151, 151, 151)
                                .add(viewButton)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(ratingButton)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(reservationButton)))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jLabel1)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(restNameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel2))
                        .add(18, 18, 18)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(areaComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel3))
                        .add(34, 34, 34)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jLabel4)
                            .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 71, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(26, 26, 26)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(jLabel5)
                            .add(priceComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(18, 18, 18)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(searchButton)
                            .add(cleanButton))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jLabel6)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 200, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(ratingButton)
                            .add(viewButton)
                            .add(reservationButton)))
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(20, 20, 20))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
//ανοιγεί το παράθυρο προβολής και παίρνει σαν όρισμα το id του εστιατορίου
    private void viewButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewButtonActionPerformed
        if (restId == 0) {
            JOptionPane.showMessageDialog(this, "Δεν έχετε επιλέξει εστιατόριο !");
        } else {
            RestInfoPanel rIP = new RestInfoPanel(restId);
            rIP.setVisible(true);
        }
    }//GEN-LAST:event_viewButtonActionPerformed
//ανοίγει το παράθυρο της αξιολόγηση και παίρνει σαν όρίσματα το id,το όνομα του εστιατορίου και το username του χρήστη
    private void ratingButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ratingButtonActionPerformed
        if (restId == 0) {
            JOptionPane.showMessageDialog(this, "Δεν έχετε επιλέξει εστιατόριο !");
        } else {
            RatingRest rr = new RatingRest(restId, restName, username);
            rr.setRoot(this);
            rr.setVisible(true);
            this.setEnabled(false);
        }
    }//GEN-LAST:event_ratingButtonActionPerformed

    private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitButtonActionPerformed
        //επανεργοποίησε το αρχικό παράθυρο
        root.setVisible(true);
        //κατέστρεψε τον εαυτό σου
        dispose();
    }//GEN-LAST:event_exitButtonActionPerformed

    private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed

        //δημιουργια μιας λίστας για τις παραμετρους του sql
        List<Object> params = new ArrayList<Object>();
        //Δημιουργία του sql αναλογα με το τι εχει επιλεξει ο χρηστης για αναζήτηση
        StringBuilder sb = new StringBuilder("SELECT APP.RESTAURANT.ID, APP.RESTAURANT.REST_NAME, APP.RESTAURANT.ADDRESS, APP.AREA.DESCR AREA, APP.RESTAURANT.PHONE, APP.CATEGORY.DESCR CATEGORY FROM APP.RESTAURANT, APP.CATEGORY, APP.AREA WHERE APP.RESTAURANT.CATEGORY_ID = APP.CATEGORY.ID AND APP.RESTAURANT.AREA_ID = APP.AREA.ID ");


        //αν εχει επιλέξει ονομα τοτε προσθετει στο sql το παρακατω και προσθετει στην λιστα την αναλογη παραμετρο
        if (restNameTextField.getText().isEmpty() == false) {
            sb.append(" AND APP.RESTAURANT.REST_NAME LIKE ?");
            params.add("%" + restNameTextField.getText() + "%");
        }
        //αν εχει επιλέξει περιοχή τοτε προσθετει στο sql το παρακατω και προσθετει στην λιστα την αναλογη παραμετρο
        if (areaComboBox.getSelectedItem() != null) {
            sb.append(" AND APP.RESTAURANT.AREA_ID = ?");
            params.add(((Area) areaComboBox.getSelectedItem()).getId());
        }
        //αν εχει επιλέξει κατηγορία τοτε προσθετει στο sql το παρακατω και προσθετει στην λιστα την αναλογη παραμετρο
        if (categoryList.getSelectedValue() != null) {
            sb.append(" AND APP.RESTAURANT.CATEGORY_ID = ?");
            params.add(((Category) categoryList.getSelectedValue()).getId());
        }
        //αν εχει επιλέξει εύρος τιμών τοτε προσθετει στο sql το παρακατω και προσθετει στην λιστα την αναλογη παραμετρο
        if (priceComboBox.getSelectedItem() != null) {
            sb.append(" AND APP.RESTAURANT.PRICE_ID = ?");
            params.add(((Price) priceComboBox.getSelectedItem()).getId());
        }

        /*δημιουργία ενος αντικειμενου τυπου restaurantTableModel που κρατάει τα εστιατόρια μετα την
        εκτέλεση του sql που δημουργησαμε στην βάση*/
        ArrayList<RestaurantTableModel> results = dbm.retrieveRestaurantFromSearch(sb.toString(), params);
        //δημιουργούμε ενα μοντέλο για τον πίνακα που θα μας δέιχνει τα αποτελέσματα και μετα το κανουμε set στον πίνακα 
        ResultsTableModel model = new ResultsTableModel(new Vector(results));
        resultTable.setModel(model);
        if (resultTable.getRowCount() <= 0) {
            JOptionPane.showMessageDialog(this, "Δεν βρέθηκε κανένα εστιατόριο!");
        }
        //θελουμε να επιλέγουμε ολη την γραμμη του πίνακα και οχι μονο ένα πεδίο
        resultTable.setColumnSelectionAllowed(false);
        resultTable.setRowSelectionAllowed(true);
        //προσθετουμε ένα listener για καθε φορα που αλλάζουμε γραμμή
        resultTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            //με καθε αλλάγη γραμμής αποθηκεύουμε σε μεταβλήτες το id και το ονομα του εστιατορίου

            public void valueChanged(ListSelectionEvent lse) {
                Restaurant r = new Restaurant();
                r.setId((Integer) resultTable.getModel().getValueAt(resultTable.getSelectedRow(), 5));
                r.setRestName((String) resultTable.getModel().getValueAt(resultTable.getSelectedRow(), 0));
                restId = r.getId();
                restName = r.getRestName();
            }
        });

    }//GEN-LAST:event_searchButtonActionPerformed
    //καθαρισμός πεδίων στην μασκα αναζήτησης
    private void cleanButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cleanButtonActionPerformed
        restNameTextField.setText("");
        areaComboBox.setSelectedIndex(-1);
        categoryList.clearSelection();
        priceComboBox.setSelectedIndex(-1);
    }//GEN-LAST:event_cleanButtonActionPerformed

    private void reservationButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reservationButtonActionPerformed
        if (restId == 0) {
            JOptionPane.showMessageDialog(this, "Δεν έχετε επιλέξει εστιατόριο !");
        } else {
            System.out.println(restId);
            ReservRest rr = new ReservRest(dbm, service, restId, restName, username, reservation);
            rr.setVisible(true);
        }
    }//GEN-LAST:event_reservationButtonActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JComboBox areaComboBox;
    private javax.swing.JList categoryList;
    private javax.swing.JButton cleanButton;
    private javax.swing.JButton exitButton;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JComboBox priceComboBox;
    private javax.swing.JButton ratingButton;
    private javax.swing.JButton reservationButton;
    private javax.swing.JTextField restNameTextField;
    private javax.swing.JTable resultTable;
    private javax.swing.JButton searchButton;
    private javax.swing.JButton searchRestButton;
    private javax.swing.JButton viewButton;
    // End of variables declaration//GEN-END:variables

    //inner κλάση για το μοντελο για τις λίστα κατηγοριων
    class CategoryListModel extends AbstractListModel {

        List<Category> categories = null;

        public CategoryListModel() {
            categories = dbm.retrieveCategories();
        }

        public int getSize() {
            return categories.size();
        }

        public Object getElementAt(int i) {
            return categories.get(i);
        }

        public void addCategory(Category x) {
            categories.add(x);
            fireContentsChanged(this, categories.size() - 1, categories.size() - 1);
        }

        public void removeCategory(Category x) {
            categories.remove(x);
            fireContentsChanged(this, categories.size() - 1, categories.size() - 1);
        }

        public void updateModel() {
            fireContentsChanged(this, categories.size() - 1, categories.size() - 1);
        }
    }

//inner κλαση για το μοντέλο των combobox περιοχών
    class AreaComboBoxModel extends javax.swing.DefaultComboBoxModel {

        ArrayList<Area> areas = dbm.retrieveAreas();

        public int getSize() {
            return areas.size();
        }

        public Object getElementAt(int i) {
            return areas.get(i);
        }

        public void addArea(Area x) {
            areas.add(x);
            fireContentsChanged(this, areas.size() - 1, areas.size() - 1);
        }

        public void removeArea(Area x) {
            areas.remove(x);
            fireContentsChanged(this, areas.size() - 1, areas.size() - 1);
        }

        public void updateModel() {
            fireContentsChanged(this, areas.size() - 1, areas.size() - 1);
        }
    }

//inner κλάση για το μοντελο των combobox των εύρων τιμών
    class PriceComboBoxModel extends javax.swing.DefaultComboBoxModel {

        ArrayList<Price> prices = dbm.retrievePrices();

        public int getSize() {
            return prices.size();
        }

        public Object getElementAt(int i) {
            return prices.get(i);
        }

        public void addPrice(Price x) {
            prices.add(x);
            fireContentsChanged(this, prices.size() - 1, prices.size() - 1);
        }

        public void removePrice(Price x) {
            prices.remove(x);
            fireContentsChanged(this, prices.size() - 1, prices.size() - 1);
        }

        public void updateModel() {
            fireContentsChanged(this, prices.size() - 1, prices.size() - 1);
        }
    }
    //inner κλάση για το μοντέλο του πίνακα με τα αποτελέσματα απο την αναζήτηση  

    class ResultsTableModel extends AbstractTableModel {

        public String[] colNames = {"Όνομα", "Διεύθυνση", "Περιοχή", "Τηλέφωνο", "Κατηγορία"};
        public Class[] colTypes = {String.class, String.class, String.class, String.class, String.class, int.class};
        Vector<RestaurantTableModel> restaurantVector;

        public ResultsTableModel(Vector data) {
            super();
            this.restaurantVector = data;
        }

        public String getColumnName(int col) {
            return colNames[col];
        }

        public Class getColumnClass(int col) {
            return colTypes[col];
        }

        public int getRowCount() {
            return restaurantVector.size();
        }

        public int getColumnCount() {
            return colNames.length;
        }
//μεθοδος που παίρνει σαν ορίσματα την γραμμή του πίνακα και την στήλη και μας επιστρέφει την τιμή

        public Object getValueAt(int row, int col) {


            RestaurantTableModel r = (RestaurantTableModel) restaurantVector.elementAt(row);

            switch (col) {

                case 0: {
                    return r.getName();
                }
                case 1: {
                    return r.getAddress();
                }
                case 2: {
                    return r.getArea();
                }
                case 3: {
                    return r.getPhone();
                }
                case 4: {
                    return r.getCategory();
                }
                case 5: {
                    return r.getId();
                }
                default: {
                    return new String();
                }
            }

        }

        public void setValueAt(Object value, int row, int col) {

            RestaurantTableModel r = (RestaurantTableModel) restaurantVector.elementAt(row);

            switch (col) {

                case 0: {
                    r.setName((String) value);
                    break;
                }
                case 1: {
                    r.setAddress((String) value);
                    break;
                }
                case 2: {
                    r.setArea((String) value);
                    break;
                }
                case 3: {
                    r.setPhone((String) value);
                    break;
                }
                case 4: {
                    r.setCategory((String) value);
                    break;
                }
            }

        }
    }
}
